package com.treeeroot.thread;

import com.alibaba.fastjson.JSONObject;

import java.util.concurrent.LinkedBlockingQueue;

/**
 * @author xugenyin
 * 基于多线程方式手写MQ
 */
public class MakeThreadMq {
    /**
     * LinkedBlockingQueue 是 Java 集合库中的一种阻塞队列，它具有以下特点：
     * <p>
     * 内部实现：底层由一个链表数据结构实现，所以它没有容量限制。
     * 数据有序：由于是链表，所以数据是有序的，每个元素都按照插入的顺序排列。
     * 阻塞式操作：支持在队列为空时等待队列变为非空，或者在队列已满时等待队列变得空闲。
     * 这样，就可以通过阻塞式队列来控制线程的执行状态。
     * 线程安全：适用于多线程环境下，对队列的所有操作都是线程安全的。
     * 使用 LinkedBlockingQueue 可以实现多线程之间的通信或者协作。
     * 例如，在生产者-消费者模型中，生产者线程可以将数据插入到队列中，
     * 而消费者线程则可以从队列中取出数据进行处理。当队列为空时，消费者线程会自动阻塞，
     * 直到队列中有数据可供消费；当队列已满时，生产者线程会自动阻塞，直到队列中有空闲位置可以插入数据
     */
    private static LinkedBlockingQueue<JSONObject> messages = new LinkedBlockingQueue();

    public static void main(String[] args) {
        //生产线程
        Thread producer = new Thread(new Runnable() {
            public void run() {
                try {
                    //不停的发消息
                    while (true) {
                        Thread.sleep(1000);
                        JSONObject data = new JSONObject();
                        data.put("userId", "1234");//存放消息
                        messages.offer(data);//把消息放到堆里
                        System.out.println("生产消息：" + data);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }, "生产线程");
        producer.start();//启动线程
        //消费线程
        Thread consumer = new Thread(new Runnable() {
            public void run() {
                try {
                    //不停的读消息
                    while (true) {
                        //从堆里取出消息
                        JSONObject poll = messages.poll();
                        if (poll != null) {
                            System.out.println("消费消息：" + poll);
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }, "消费者线程");
        consumer.start();
    }

}
